package cn.kgc.springmvc.controller;

import cn.kgc.springmvc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: mosin
 * @version: v1.0  2022/10/18
 */
@Controller
@RequestMapping("res")
@SessionAttributes("msg") //  将model中的数据放置到session中一份
//@RestController  //  1.全局以json格式进行数据的响应   2. 声明控制层 @Controller
public class ResponseController {

    @RequestMapping("rs1")
    public String  res01(){

        return "index";  // 视图名  -> 视图解析器  -> /index.jsp  转发
    }

    @RequestMapping("rs2")
    public ModelAndView res02(){

        ModelAndView modelAndView = new ModelAndView();
        // 设置视图名
        modelAndView.setViewName("index");
        //设置响应数据
        modelAndView.addObject("msg", "hello tom");
        return  modelAndView;   //    视图解析器  -> 转发   model中的数据或存入request对象
    }


    @RequestMapping("rs3")
    public String  res03(Model model){

        //  模型对象  设置数据  -> request
        model.addAttribute("msg", "hello tom");

        return "index";  // 视图名  -> 视图解析器  -> /index.jsp  转发
    }


    /**
     *  springmvc中支持使用转发和重定向实现页面的跳转
     * 默认使用转发
     *  forward    转发
     *  redirect  重定向
     */

    @RequestMapping("rs4")
    public String  res04(HttpServletRequest request){

        //将共享数据 封装在session域中
        HttpSession session = request.getSession();
        session.setAttribute("msg", "hello jack");
        // 页面的跳转使用重定向  不在使用视图解析器
        return "redirect:/index.jsp";
    }

    @RequestMapping("rs5")
    public String  res05(HttpSession session){
        //将共享数据 封装在session域中
        session.setAttribute("msg", "hello jack");
        // 页面的跳转使用重定向  不在使用视图解析器
        return "redirect:/index.jsp";
    }

    @RequestMapping("rs6")
    public String  res06(Model model){
        //将共享数据 封装在session域中
        model.addAttribute("msg", "hello model");
        // 页面的跳转使用重定向  不在使用视图解析器
        return "redirect:/index.jsp";
    }

    // 通过HttpServletRequest 实现转发
    @RequestMapping("rs7")
    public void  res07(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 转发实现页面跳转
        request.setAttribute("info", "hello servlet");
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }

    // HttpServletResponse 实现重定向
    @RequestMapping("rs8")
    public void  res08(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 转发实现页面跳转
        HttpSession session = request.getSession();
        session.setAttribute("info", "hello session");
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }


    // 使用springmvc中提供的转发实现页面的跳转
    @RequestMapping("rs9")
    public String res09() {  //forward
        return "forward:/index.jsp";    //不经过视图解析的解析 需要将视图的名称写完整
    }


    @RequestMapping("rs10")
    @ResponseBody
    public List<User> res10() {

        // 调用业务层查询所有用户信息

        User user = new User();
        user.setAge(20);
        user.setId(10);

        ArrayList<User> users = new ArrayList<>();
        users.add(user);
        users.add(user);
        users.add(user);
        users.add(user);

        // json格式数据响应 springmvc中可以通过注解的方式实现数据格式的声明

        return users;
    }


    //获取session对象中存储的数据

    @RequestMapping("rs11")
    public String res11(HttpSession session) {
        Object info = session.getAttribute("info");
        System.out.println("info = " + info);
        return "index";
    }


    @RequestMapping("rs12")
    public String res12(@SessionAttribute(name = "info") String info) {
        System.out.println("info = " + info);
        return "index";
    }


    @RequestMapping("rs13")
    public String res13(HttpServletResponse response) {
        // 创建cookie对象
        Cookie cookie = new Cookie("info", "cookie");
        response.addCookie(cookie);
        return "redirect:/index.jsp";
    }


    @RequestMapping("rs14")
    public String res14(@CookieValue(name = "info") String ckValue) {
        // 创建cookie对象
        System.out.println("ckValue = " + ckValue);
        return "index";
    }

}
